I/O Multiplexing হলো একটি প্রক্রিয়া, যা একাধিক I/O চ্যানেল (যেমন: Socket, ফাইল ডেসক্রিপ্টর) পর্যবেক্ষণ এবং একসাথে পরিচালনা করতে ব্যবহৃত হয়। এটি একাধিক I/O অপারেশন সমান্তরালে সম্পন্ন করে, যাতে একটি প্রোগ্রাম একাধিক Socket-এ বা ফাইল ডেসক্রিপ্টরে I/O ইভেন্টের জন্য অপেক্ষা করতে পারে এবং যেই Socket বা ফাইল ডেসক্রিপ্টর প্রস্তুত (Ready) হয়, সেই অনুযায়ী কাজ করে। I/O Multiplexing সাধারণত select(), poll(), এবং epoll() এর মতো সিস্টেম কল ব্যবহার করে বাস্তবায়িত হয়।
I/O Multiplexing এমন একটি পদ্ধতি, যেখানে একটি প্রোগ্রাম একাধিক I/O চ্যানেলকে পর্যবেক্ষণ করতে পারে এবং যেই চ্যানেল প্রস্তুত হয় (যেমন: ডেটা পাঠানো বা গ্রহণ করার জন্য), সেই অনুযায়ী অপারেশন সম্পন্ন করে। এটি বিশেষত নেটওয়ার্ক প্রোগ্রামিং এবং সার্ভার ডিজাইনে ব্যবহৃত হয়, যেখানে একাধিক ক্লায়েন্ট সংযোগ সমান্তরালে পরিচালনা করতে হয়।
I/O Multiplexing ব্যবহারের প্রধান কারণ হলো একাধিক I/O চ্যানেল বা সংযোগ একসাথে পরিচালনা করা। এটি বিশেষ করে নেটওয়ার্ক সার্ভার এবং বড় স্কেল অ্যাপ্লিকেশনগুলোতে অপরিহার্য, যেখানে একাধিক ক্লায়েন্ট সংযোগ বা ডেটা অপারেশন সমান্তরালে পরিচালনা করতে হয়। নিচে I/O Multiplexing এর প্রয়োজনীয়তা নিয়ে আলোচনা করা হলো:
Concurrency এবং Scalability:
Resource Efficiency:
Low Latency:
Event-Driven Programming Support:
Non-Blocking I/O অপারেশন:
I/O Multiplexing সাধারণত তিনটি প্রধান সিস্টেম কলের মাধ্যমে পরিচালিত হয়:
select():
poll():
select()
-এর একটি আধুনিক সংস্করণ, যা একাধিক ফাইল ডেসক্রিপ্টর একসাথে পর্যবেক্ষণ করতে পারে। এটি select()
-এর কিছু সীমাবদ্ধতা দূর করে এবং ফাইল ডেসক্রিপ্টরগুলোর সাথে যুক্ত ইভেন্টগুলো পরিচালনা করে।epoll() (Linux-specific):
epoll()
ব্যবহার করা হয়, যা select()
এবং poll()
-এর তুলনায় অনেক বেশি কার্যকর এবং স্কেলেবল। এটি একাধিক সংযোগ পর্যবেক্ষণ করতে খুব কম CPU এবং মেমরি ব্যবহার করে এবং বড় স্কেল অ্যাপ্লিকেশনের জন্য উপযোগী।নিচে একটি সাধারণ উদাহরণ দেখানো হয়েছে, যেখানে Python ব্যবহার করে select()
ফাংশনের মাধ্যমে I/O Multiplexing করা হয়েছে:
import select
import socket
# একটি TCP Socket তৈরি করা
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(5)
server_socket.setblocking(False)
# ফাইল ডেসক্রিপ্টরগুলোর তালিকা
sockets_list = [server_socket]
print("Server is listening on port 8080...")
while True:
# select() ব্যবহার করে I/O Multiplexing
read_sockets, _, _ = select.select(sockets_list, [], [])
for notified_socket in read_sockets:
if notified_socket == server_socket:
# নতুন সংযোগ গ্রহণ করা
client_socket, client_address = server_socket.accept()
client_socket.setblocking(False)
sockets_list.append(client_socket)
print(f"Accepted new connection from {client_address}")
else:
# ক্লায়েন্ট থেকে ডেটা পড়া
data = notified_socket.recv(1024)
if not data:
print("Connection closed.")
sockets_list.remove(notified_socket)
notified_socket.close()
else:
print(f"Received data: {data.decode()}")
select()
ব্যবহার করে একাধিক Socket পর্যবেক্ষণ করা হচ্ছে, এবং কোন Socket-এ নতুন ডেটা পাওয়া গেলে বা সংযোগ তৈরি হলে সেই অনুযায়ী কাজ করা হচ্ছে।common.read_more